#ifndef PREIDENTIFIEDOBJECT_H
#define PREIDENTIFIEDOBJECT_H

#include "SimEngine/Polynomial.h"
#include <boost/smart_ptr.hpp>

namespace Jano
{
class PreIdentifiedObject;
/**
    Alias na zręczny wskaźnik dla DiscreteObject.
*/
typedef boost::shared_ptr<PreIdentifiedObject> PreIdentifiedObjectSPtr;

/**
  \class Wstępnie zidentyfikowany obiekt

  Zadaniem tej klasy jest przechowywanie parametrów wstępnie
  zidentyfikowanych obiektów, aby pominąc identyfikację w regulatorze GPC.

  */
class PreIdentifiedObject
{
private:
    RafMat::SimEngine::Polynomial m_polyA;  //! Wielomian A modelu ARX
    RafMat::SimEngine::Polynomial m_polyB;  //! Wielomian B modelu ARX
    unsigned int m_delay;                   //! Opóźnienie obiektu

public:
    /** \brief Konstruktor domyślny

      Konstruktor ustawiający prostą inercję.
      B = 0.5; A = [1 -0.5]; delay = 1;
      */
    PreIdentifiedObject();

    /** \brief Konstruktor przeciążony

      Konstruktor pozwala na ustawienie wszystkich parametrów
      tworzonego obiektu.
      */
    PreIdentifiedObject(RafMat::SimEngine::Polynomial &polyA, RafMat::SimEngine::Polynomial &polyB, unsigned int delay);

    /** \brief Ustawienie mianownika

      Metoda pozwalająca na ustawienie wielomianu A
      wstępnie zidentyfikowanego obiektu.

      \param polyA wielomian A
      */
    void setPolyA(RafMat::SimEngine::Polynomial &polyA);

    /** \brief Pobranie mianownika

      Metoda pozwalająca na dostęp do wartości wielomianu A.

      \return wielomian A
      */
    RafMat::SimEngine::Polynomial getPolyA();

    /** \brief Stopień mianownika

      Metoda pozwalająca na sprawdzenie stopnia mianownika,
      czyli wielominau A

      \return stopień mianownika
      */
    unsigned int getDegreeA();

    /** \brief Ustawienie parametrów licznika

      Metoda pozwalająca na ustawienie wartości licznika,
      a więc wielomianu B.

      \return wielomian B
      */
    void setPolyB(RafMat::SimEngine::Polynomial &polyB);

    /** \brief Dostęp do licznika

      Metoda pozwalająca na dostęp do wartości wielomianu A.

      \return wielomian B
      */
    RafMat::SimEngine::Polynomial getPolyB();

    /** \brief Stopień mianownika

      Metoda pozwalająca na sprawdzenie stopnia licznika,
      czyli wielominau B

      \return stopień licznika
      */
    unsigned int getDegreeB();

    /** \brief Ustawienie wielomianu A

      Metoda pozwalająca na ustawienie wielomianu A
      wstępnie zidentyfikowanego obiektu.

      \return wielomian A
      */
    void setDelay(unsigned int delay);

    /** \brief Wartość opóźnienia

      Metoda pozwalająca na sprawdzenie wartości opóźnienia
      zidentyfikowanego obiektu

      \return opóźnienie modelu
      */
    unsigned int getDelay();
};
}

#endif // PREIDENTIFIEDOBJECT_H
